
// 防抖 debounce
/***
 * 1. 对于在事件被触发 n 秒后再执行的回调 -> 延迟执行
 * 2. 如果在这 n 秒内再次触发该事件，则重新开始计时
 */

// 应用场景：数据请求、表单提交，按钮事件等

// 1. 是否首次延迟执行
// 2. n 秒内触发事件不执行事件处理函数(n秒内频繁触发使劲按，计时器回频繁重新开始计时)


function debounce(fn, delay, triggleNow) {
  let t = null;
  // let res; // 要是函数有返回值

  let debounced = function () {
    let _self = this,
        _args = arguments;

    if (t)
      clearTimeout(t);

    if (triggleNow) {
      let exec = !t; // 设置一个开关 防止下次进来

      t = setTimeout(() => {
        t = null;
      }, delay);

      if (exec) {
        fn.apply(_self, _args);
        // res = fn.apply(_self, _args);
      }
    } else {
      t = setTimeout(() => {
        fn.apply(_self, _args);
        // res = fn.apply(_self, _args);
      }, delay)
    }
    // return res;
  }

  debounced.remove = function () {
    clearTimeout(t);
    t = null;
  }

  return debounced;
}




// 节流 throttle
/**
 * 事件被触发后，n 秒内只执行一次事件处理函数
 * 
 */

// 应用场景：监听滚动条，表单输入验证等


function throttle(fn, delay) {
  let t = null,
      begin = Date.now();

  return function () {
    let _self = this,
        _args = arguments,
        cur = Date.now();

    clearTimeout(t);

    if (cur - begin >= delay) {
      fn.apply(_self, _args);
      begin = cur;
    } else {
      t = setTimeout(() => {
        fn.apply(_self, _args)
      }, delay)
    }
  }
}
